package com.itheima.springboot_24_mq.service.impl.rabbitmq.topic.config;

import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.TopicExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

//@Configuration //这也是为了让springboot可以自动加载这个配置类,成为bean对象
public class RabbitConfigTopic {
    @Bean
    public Queue topicQueue(){//这是一个队列对象
        System.out.println("队列1");
        return new Queue("topicQueue",true,false,true);
        //topicQueue 表明队列名称
        //是否持久化;本次连接mq是否是专用连接,如果true,连接断开,队列删除;是否会在没人生产者和消费者用时自动删除该队列
    }
    @Bean
    public Queue topicQueue2(){//这是一个队列对象
        System.out.println("队列1");
        return new Queue("topicQueue2",true,false,true);
        //topicQueue 表明队列名称
        //是否持久化;本次连接mq是否是专用连接,如果true,连接断开,队列删除;是否会在没人生产者和消费者用时自动删除该队列
    }
    @Bean
    public TopicExchange topicExchange(){ //这是一个交换机,用于队列连接队列服务;一个交换机可以为多个队列提供绑定服务,只是每次绑定后各自绑定行为的名字不要重复
        return new TopicExchange("topicExchange");
    }
    @Bean
    public Binding binding(){ //这是一个绑定对象=topicExchange+topicQueue
        System.out.println("binding1");
        return BindingBuilder.bind(topicQueue()).to(topicExchange()).with("topic.*.id");
        //假设消息来时要进入的连接名是topic.order.id,那么这则消息会同时匹配上"topic.*.id"和"topic.order.*"2个连接,从而达到一次消息,同时到达2个不同连接,即2个不同队列
        //即topic就是通过这种方式,完成消息分发的
        //而这也是topic于direct不同之处
        //direct是连接名是固定的,不能写正则
        //所以推荐用topic模式
        //topic.*.id这是绑定名,在放入数据时用得到
    }
    @Bean
    public Binding binding2(){ //这是一个绑定对象=topicExchange+topicQueue
        System.out.println("binding2");
        return BindingBuilder.bind(topicQueue2()).to(topicExchange()).with("topic.order.*");
        //topic.order.*这是绑定名,在放入数据时用得到
        //做2个binding的目的是为了展示绑定名可以是正则形式的,这样符合正则的存入行为就被采纳.
        //同时符合2个正则的放入行为,会在2个绑定中生效
    }
}
